﻿package com.tools
{
	import flash.display.*;
	import flash.events.*;
	import com.vobject.ImageVO;
	import flash.text.TextField;
	import flash.net.URLRequest;
	import com.config.GalleryConfig;
	
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// CLASSE UTILISÉE POUR LE CHARGEMENT D'UNE IMAGE
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public class ImageLoader extends Sprite
	{
		// conteneur de l'image
		public var _imageContainer : Sprite;
		
		// contient les infos de l'image extraites du XML
		public var infos		: ImageVO;
		
		// propriétés utiles au suivi du chargement de l'élément
		public var initialized		: Boolean = false;
		public var loaded			: Boolean = false;
		
		// loader de l'élément
		private var _imageLoader	: Loader;
		// LoaderInfo utiliser pour extraire les données du loader
		private var _imageLI		: LoaderInfo;
		
		// zone de texte à afficher pendant le chargement des images
		private var _waitingText	: TextField = new TextField( );
		
		// CONSTRUCTEUR
		function ImageLoader ( imageVO : ImageVO )
		{
			// on initialise les variables de repère ('flags')
			if ( loaded ) loaded = false;
			initialized = true;
			// on stocke les informations de l'image extraites du XML
			infos = imageVO;
			// on crée un Sprite conteneur pour envelopper l'image et permettre une meilleure gestion de l'interactivité
			_imageContainer = new Sprite( );
			// on ajoute le conteneur à la DisplayList
			addChild( _imageContainer );
			// on lance la méthode d'initialisation
			init();
		}
		
		// méthode qui gère le préchargement de l'image
		private function init( ) : void
		{
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			// MECANISME POUR LE CHARGEMENT D'UNE IMAGE VIA UN LOADER
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			var requete : URLRequest = new URLRequest();
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			requete.url 	= GalleryConfig.RESOURCE_FOLDER + GalleryConfig.SLASH + GalleryConfig.IMAGE_FOLDER + GalleryConfig.SLASH + infos.name;
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			_imageLoader = new Loader( );
			_imageLoader.load( requete );
			_imageLI = _imageLoader.contentLoaderInfo;
			
			_imageLI.addEventListener ( Event.INIT, initLoading );
			_imageLI.addEventListener ( Event.OPEN, beginLoading );
			_imageLI.addEventListener ( ProgressEvent.PROGRESS, loading );
			_imageLI.addEventListener ( Event.COMPLETE, loadingComplete );
			_imageLI.addEventListener ( IOErrorEvent.IO_ERROR, loadingFailed );
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES PRIVEES : GESTIONNAIRES DE CHARGEMENT
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// méthode déclenchée à l'initialisation du chargement
		private function initLoading ( pEvt : Event ):void
		{
			trace ("initialisation du chargement");
		}
		
		// méthode déclenchée au démarrage du chargement
		private function beginLoading ( pEvt : Event ):void
		{
			trace ("démarre chargement");
			_imageContainer.addChild( _waitingText );
		}
		
		// méthode déclenchée de façon lors du chargement (utile pour faire une barre de progression par exemple)
		private function loading ( pEvt : ProgressEvent ):void
		{
			_waitingText.text = "chargement...";
			trace ("chargement en cours");
		}
		
		// méthode déclenchée lorsque le chargement est réussi
		private function loadingComplete ( pEvt : Event ):void
		{
			trace( "loading COMPLETE" );
			// on enlève de la DisplayList la zone de texte qui sert à patienter pendant le chargement
			_imageContainer.removeChild( _waitingText );
			
			// on met à jour les variables 'flags'
			initialized = false;
			loaded = true;
			
			// on crée une variable qui va nous servir à générer la vignette
			var size : String;
			
			// on checke si c'est la largeur ou la hauteur qui est la plus grande pour calculer le ratio (vignette)
			if ( infos.width >= infos.height ) 
				size = "width";
			else
				size = "height";
			// on calcule le ratio avec lequel on va redimensionner la vignette
			var ratio : Number = infos[ size ] / GalleryConfig[ "THUMB_" + size.toUpperCase() ];
			
			// on en déduit la taille effective de la vignette
			var w : Number = infos.width / ratio;
			var h : Number = infos.height / ratio;
			
			// on divise la taille de l'image par le ratio pour obtenir la bonne dimension de la vignette
			pEvt.target.content.width 	= w;
			pEvt.target.content.height 	= h;
			
			// si l'image est plus petite que la taille entière de la vignette, on centre l'image en hauteur et largeur
			pEvt.target.content.x = ( GalleryConfig.THUMB_WIDTH - w ) / 2;
			pEvt.target.content.y = ( GalleryConfig.THUMB_HEIGHT - h ) / 2;
			
			// on ajoute l'image chargée à son conteneur Sprite
			_imageContainer.addChild( pEvt.target.content );
			
			// on diffuse l'Event COMPLETE pour notifier aux classes externes que le chargement est réussi et fini
			dispatchEvent ( new Event( Event.COMPLETE ) );
		}
		
		// méthode déclenchée lorsque le chargement échoue
		private function loadingFailed ( pEvt : IOErrorEvent ):void
		{
			trace ("erreur de chargement ImageLoader : " + pEvt.text + "\n");
		}
	}
}